home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SPACE 1
/
SPACE - Library 1 - Volume 1.iso
/
games
/
575
/
3deis
/
setz_ab.gfa
(
.txt
)
< prev
next >
Wrap
GFA-BASIC Atari
|
1986-02-05
|
25KB
|
1,164 lines
@vorbereitung
@laden
@titelbild
@level
@hilfs_bs
@bildaufbau
@zufall
@anzeige
zeit%=TIMER
ON BREAK GOSUB ende
ON MENU KEY GOSUB abfrage
DO
t|=(TIMER-zeit%)/200
IF t|=intervall|
@tief_schieben
@anzeige
zeit%=TIMER
ENDIF
ON MENU
LOOP
> PROCEDURE vorbereitung
IF XBIOS(4)<>2
ALERT 3,"|Sorry, das Programm läuft nur|mit einem Monochrom-Monitor !",1,"Schade!",dummy&
SYSTEM
ENDIF
DIM p.feld|(2,2,3),f.feld|(2,2,3),feld|(11,2,3),hoch|(2,3),hoch1|(2,3)
DIM x&(3),y&(3),s|(10),li|(10),ob|(10),screen%(1),nam$(12),pkt%(12)
RESERVE FRE(0)-33000
adresse%=GEMDOS(&H48,L:32256)
screen%(0)=INT(adresse%/256)*256+256
screen%(1)=XBIOS(3)
DEFMOUSE 0
DEFFILL 1,1
PBOX 0,0,640,399
leer$=" "
leer1$=" "
ARRAYFILL hoch|(),10
FOR j|=0 TO 2
FOR k|=0 TO 3
feld|(10,j|,k|)=1
NEXT k|
NEXT j|
RETURN
> PROCEDURE abfrage
IF MENU(13)=2
SELECT SHR&(MENU(14),8)
CASE 72
@oben_rollen
CASE 80
@unten_rollen
CASE 75
@links_rollen
CASE 77
@rechts_rollen
CASE 71
@rechts_drehen
CASE 82
@links_drehen
ENDSELECT
ELSE
SELECT SHR&(MENU(14),8)
CASE 1
@ende
CASE 15
SGET bild1$
@best_liste
SPUT bild1$
zeit%=TIMER-t|*200
CASE 72
@oben_schieben
CASE 80
@unten_schieben
CASE 75
@links_schieben
CASE 77
@rechts_schieben
CASE 57
doppel|=1
@setzen
CLR e|,e1|
ARRAYFILL f.feld|(),0
zeit%=TIMER
@zufall
CASE 98
SGET bild1$
@hilfs_bs
SPUT bild1$
zeit%=TIMER-t|*200
ENDSELECT
ENDIF
@anzeige
REPEAT
UNTIL INKEY$=""
RETURN
> PROCEDURE bildaufbau
VOID XBIOS(5,L:screen%(0),L:screen%(1),-1)
DEFFILL 1,2,4
PBOX 0,0,639,399
DEFFILL 0,0
PBOX 18,18,502,382
RESTORE seiten
FOR i|=0 TO 10
READ s|(i|)
NEXT i|
seiten:
DATA 120,99,81,67,55,45,37,30,25,20,16
xm&=260
ym|=200
DEFLINE 3
FOR i|=0 TO 10
BOX xm&-2*s|(i|),ym|-1.5*s|(i|),xm&+2*s|(i|),ym|+1.5*s|(i|)
li|(i|)=xm&-2*s|(i|)
ob|(i|)=ym|-1.5*s|(i|)
NEXT i|
DEFLINE 1
BOX 228,176,292,224
ALINE 228,192,292,192,1,-1,0
ALINE 228,208,292,208,1,-1,0
ALINE xm&,176,xm&,224,1,-1,0
ALINE 244,176,244,224,1,-1,0
ALINE 276,176,276,224,1,-1,0
FOR i|=0 TO 4
ALINE 20+i|*120,20,228+i|*16,176,1,&HF0F,0
ALINE 20+i|*120,380,228+i|*16,224,1,&HF0F,0
NEXT i|
ALINE 20,140,228,192,1,&HF0F,0
ALINE 20,260,228,208,1,&HF0F,0
ALINE 500,140,292,192,1,&HF0F,0
ALINE 500,260,292,208,1,&HF0F,0
DEFFILL 0,0
FOR i&=20 TO 353 STEP 37
PBOX 509,i&,551,i&+32
BOX 510,i&+1,550,i&+31
ALINE 510,i&+11,550,i&+11,1,-1,0
ALINE 510,i&+21,550,i&+21,1,-1,0
ALINE 520,SUCC(i&),520,i&+31,1,-1,0
ALINE 530,SUCC(i&),530,i&+31,1,-1,0
ALINE 540,SUCC(i&),540,i&+31,1,-1,0
NEXT i&
FOR i&=10 TO 340 STEP 78
PBOX 560,i&,630,i&+68
BOX 562,i&+2,628,i&+66
NEXT i&
BOX 570,50,620,70
BOX 570,128,620,148
BOX 570,206,620,226
BOX 570,284,620,304
ALINE 562,345,628,345,1,-1,0
ALINE 562,362,628,362,1,-1,0
DEFTEXT ,,,6
TEXT 566,22,58,"Gesetzte"
TEXT 566,100,58,"Erreichte"
TEXT 566,178,58,"Höchste"
TEXT 564,256,63,"Zeit s"
TEXT 564,356,62,"ESC->Ende"
TEXT 564,373,45,"HELP->"
TEXT 588,385,39,"Hilfe"
TEXT 600,256,intervall|
DEFTEXT ,,,13
TEXT 566,40,"Figuren"
TEXT 566,118,58,"Punkte"
RSET leer$=STR$(h_punkte%)
TEXT 571,222,leer$
TEXT 566,196,58,"Punkte"
TEXT 566,274,58,"Level"
TEXT 566,340,58,"Tasten"
PRINT AT(75,19);level|
BMOVE screen%(0),screen%(1),32000
VOID XBIOS(5,L:screen%(1),L:screen%(1),-1)
SGET bild$
RETURN
> PROCEDURE anzeige
VSYNC
BMOVE screen%(0),screen%(1),32000
FOR i|=0 TO 2
FOR j|=0 TO 2
FOR k|=0 TO 3
IF f.feld|(i|,j|,k|)
CLR wuerfel|
@berechnen
@zeichnen
ENDIF
NEXT k|
NEXT j|
NEXT i|
RETURN
> PROCEDURE berechnen
SELECT i|
CASE 0
IF f.feld|(SUCC(i|),j|,k|)
ADD wuerfel|,32
ENDIF
CASE 1
IF f.feld|(SUCC(i|),j|,k|)
ADD wuerfel|,32
ENDIF
IF f.feld|(PRED(i|),j|,k|)
ADD wuerfel|,16
ENDIF
CASE 2
IF f.feld|(PRED(i|),j|,k|)
ADD wuerfel|,16
ENDIF
ENDSELECT
SELECT j|
CASE 0
IF f.feld|(i|,SUCC(j|),k|)
ADD wuerfel|,8
ENDIF
CASE 1
IF f.feld|(i|,SUCC(j|),k|)
ADD wuerfel|,8
ENDIF
IF f.feld|(i|,PRED(j|),k|)
ADD wuerfel|,2
ENDIF
CASE 2
IF f.feld|(i|,PRED(j|),k|)
ADD wuerfel|,2
ENDIF
ENDSELECT
SELECT k|
CASE 0
IF f.feld|(i|,j|,SUCC(k|))
ADD wuerfel|,4
ENDIF
CASE 3
IF f.feld|(i|,j|,PRED(k|))
INC wuerfel|
ENDIF
DEFAULT
IF f.feld|(i|,j|,SUCC(k|))
ADD wuerfel|,4
ENDIF
IF f.feld|(i|,j|,PRED(k|))
INC wuerfel|
ENDIF
ENDSELECT
RETURN
> PROCEDURE zeichnen
LOCAL lx1&,lx2&,lx3&,lx4&,oy1&,oy2&,oy3&,oy4&,l|
e|=ADD(e1|,i|)
lx1&=ADD(li|(e|),s|(e|)*k|)
lx2&=ADD(li|(SUCC(e|)),s|(SUCC(e|))*k|)
lx3&=ADD(lx1&,s|(e|))
lx4&=ADD(lx2&,s|(SUCC(e|)))
oy1&=ADD(ob|(e|),s|(e|)*j|)
oy3&=ADD(ob|(e|),s|(e|)*SUCC(j|))
oy2&=ADD(ob|(SUCC(e|)),s|(SUCC(e|))*j|)
oy4&=ADD(ob|(SUCC(e|)),s|(SUCC(e|))*SUCC(j|))
FOR l|=1 TO doppel|
IF BTST(wuerfel|,0)=FALSE
IF BTST(wuerfel|,1)=FALSE
ALINE lx1&,oy1&,lx2&,oy2&,1,TRUE,FALSE
ENDIF
IF BTST(wuerfel|,4)=FALSE
ALINE lx1&,oy1&,lx1&,oy3&,1,TRUE,FALSE
ENDIF
IF BTST(wuerfel|,5)=FALSE
ALINE lx2&,oy2&,lx2&,oy4&,1,TRUE,FALSE
ENDIF
ENDIF
IF BTST(wuerfel|,1)=FALSE
IF BTST(wuerfel|,2)=FALSE
ALINE lx3&,oy1&,lx4&,oy2&,1,TRUE,FALSE
ENDIF
IF BTST(wuerfel|,4)=FALSE
ALINE lx1&,oy1&,lx3&,oy1&,1,TRUE,FALSE
ENDIF
IF BTST(wuerfel|,5)=FALSE
ALINE lx2&,oy2&,lx4&,oy2&,1,TRUE,FALSE
ENDIF
ENDIF
IF BTST(wuerfel|,2)=FALSE
IF BTST(wuerfel|,3)=FALSE
ALINE lx3&,oy3&,lx4&,oy4&,1,TRUE,FALSE
ENDIF
IF BTST(wuerfel|,4)=FALSE
ALINE lx3&,oy1&,lx3&,oy3&,1,TRUE,FALSE
ENDIF
IF BTST(wuerfel|,5)=FALSE
ALINE lx4&,oy2&,lx4&,oy4&,1,TRUE,FALSE
ENDIF
ENDIF
IF BTST(wuerfel|,3)=FALSE
IF BTST(wuerfel|,0)=FALSE
ALINE lx1&,oy3&,lx2&,oy4&,1,TRUE,FALSE
ENDIF
IF BTST(wuerfel|,4)=FALSE
ALINE lx3&,oy3&,lx1&,oy3&,1,TRUE,FALSE
ENDIF
IF BTST(wuerfel|,5)=FALSE
ALINE lx2&,oy4&,lx4&,oy4&,1,TRUE,FALSE
ENDIF
ENDIF
INC lx1&
INC lx2&
INC lx3&
INC lx4&
INC oy1&
INC oy3&
INC oy2&
INC oy4&
CLR doppel!
NEXT l|
RETURN
> PROCEDURE punkte
RSET leer1$=STR$(figur&)
TEXT 575,66,leer1$
RSET leer$=STR$(punkte%)
TEXT 571,144,leer$
IF zaehler|=25
CLR zaehler|
IF level|<7
INC level|
ENDIF
@levelconfig
ENDIF
DEFTEXT ,,,6
TEXT 600,256," "
TEXT 600,256,intervall|
DEFTEXT ,,,13
PRINT AT(75,19);level|
INC zaehler|
BMOVE screen%(1),screen%(0),32000
RETURN
> PROCEDURE zufall
wert|=SUCC(RANDOM(7))
IF ultimo!
wert|=SUCC(RANDOM(4))
ENDIF
doppel|=2
CLR ultimo!
@figur
INC figur&
ADD punkte%,punkt|*faktor|
@punkte
@fig_dim
RETURN
> PROCEDURE figur
SELECT wert|
CASE 1
punkt|=1
RESTORE figur_1
CASE 2
punkt|=2
RESTORE figur_2
CASE 3
punkt|=2
RESTORE figur_3
CASE 4
punkt|=2
RESTORE figur_4
CASE 5
punkt|=3
RESTORE figur_5
CASE 6
punkt|=3
RESTORE figur_6
CASE 7
punkt|=3
RESTORE figur_7
ENDSELECT
FOR i|=1 TO 4
READ t|,b|,l|
f.feld|(t|,b|,l|)=1
NEXT i|
figur_1:
DATA 0,1,0,0,2,0,0,2,1,0,1,0
figur_2:
DATA 0,0,0,0,1,0,0,2,0,0,0,1
figur_3:
DATA 0,0,0,0,1,0,0,2,0,0,1,1
figur_4:
DATA 0,0,0,0,1,0,0,1,1,0,2,1
figur_5:
DATA 0,2,0,1,1,0,1,2,0,1,2,1
figur_6:
DATA 0,2,0,1,2,0,1,2,1,1,1,1
figur_7:
DATA 0,2,0,1,2,0,1,1,0,1,1,1
RETURN
> PROCEDURE tief_schieben
SOUND 2,15,15,4,4
WAVE 3,4,12,8000
WAVE 0,0
FOR i|=0 TO PRED(l.t|)
FOR j|=0 TO 2
FOR k|=0 TO 3
IF f.feld|(i|,j|,k|)
IF feld|(SUCC(e1|+i|),j|,k|)
belegt!=-1
ENDIF
ENDIF
NEXT k|
NEXT j|
NEXT i|
IF belegt!
@setzen
ARRAYFILL f.feld|(),0
IF e1|=1
ultimo!=TRUE
ENDIF
CLR e1|
@zufall
ELSE
INC e1|
ENDIF
CLR belegt!
RETURN
> PROCEDURE oben_schieben
IF BTST(b|,0)
PRINT CHR$(7)
ELSE
BMOVE VARPTR(f.feld|(0,1,0)),VARPTR(p.feld|(0,0,0)),33
@uebernehmen
ENDIF
RETURN
> PROCEDURE unten_schieben
IF BTST(b|,2)
PRINT CHR$(7)
ELSE
BMOVE VARPTR(f.feld|(0,0,0)),VARPTR(p.feld|(0,1,0)),33
@uebernehmen
ENDIF
RETURN
> PROCEDURE rechts_schieben
IF BTST(l|,3)
PRINT CHR$(7)
ELSE
BMOVE VARPTR(f.feld|(0,0,0)),VARPTR(p.feld|(0,0,1)),27
@uebernehmen
ENDIF
RETURN
> PROCEDURE links_schieben
IF BTST(l|,0)
PRINT CHR$(7)
ELSE
BMOVE VARPTR(f.feld|(0,0,1)),VARPTR(p.feld|(0,0,0)),27
@uebernehmen
ENDIF
RETURN
> PROCEDURE rechts_drehen
IF l.l|<3 AND l.b|<3
j%=LEN(BIN$(l|))-2
IF j%<0
j%=0
ENDIF
d|=ABS(NOT BTST(b|,0))
f.adr%=VARPTR(f.feld|(0,d|,j%))
p.adr%=VARPTR(p.feld|(0,d|,j%))
BMOVE f.adr%,p.adr%+9,3
BMOVE f.adr%+9,p.adr%+12,3
BMOVE f.adr%+12,p.adr%+3,3
BMOVE f.adr%+3,p.adr%,3
ELSE
d|=ABS(NOT BTST(l|,0))
FOR i|=0 TO PRED(l.t|)
FOR j|=0 TO 2
p.feld|(i|,j|,d|)=f.feld|(i|,2,j|+d|)
p.feld|(i|,j|,1+d|)=f.feld|(i|,1,j|+d|)
p.feld|(i|,j|,2+d|)=f.feld|(i|,0,j|+d|)
NEXT j|
NEXT i|
ENDIF
@uebernehmen
RETURN
> PROCEDURE links_drehen
IF l.l|<3 AND l.b|<3
j%=LEN(BIN$(l|))-2
IF j%<0
j%=0
ENDIF
d|=ABS(NOT BTST(b|,0))
f.adr%=VARPTR(f.feld|(0,d|,j%))
p.adr%=VARPTR(p.feld|(0,d|,j%))
BMOVE f.adr%,p.adr%+3,3
BMOVE f.adr%+3,p.adr%+12,3
BMOVE f.adr%+12,p.adr%+9,3
BMOVE f.adr%+9,p.adr%,3
ELSE
d|=ABS(NOT BTST(l|,0))
FOR i|=0 TO 2
FOR j|=0 TO 2
p.feld|(i|,0,j|+d|)=f.feld|(i|,j|,2+d|)
p.feld|(i|,1,j|+d|)=f.feld|(i|,j|,1+d|)
p.feld|(i|,2,j|+d|)=f.feld|(i|,j|,d|)
NEXT j|
NEXT i|
ENDIF
@uebernehmen
RETURN
> PROCEDURE oben_rollen
IF l.b|<3 AND l.t|<3
d|=ABS(NOT BTST(b|,0))
FOR k|=0 TO 3
IF BTST(l|,k|)
p.feld|(1,d|,k|)=f.feld|(0,d|,k|)
p.feld|(0,d|,k|)=f.feld|(0,SUCC(d|),k|)
p.feld|(0,SUCC(d|),k|)=f.feld|(1,SUCC(d|),k|)
p.feld|(1,SUCC(d|),k|)=f.feld|(1,d|,k|)
ENDIF
NEXT k|
ELSE
FOR k|=0 TO 3
IF BTST(l|,k|)
FOR j|=0 TO 2
p.feld|(0,j|,k|)=f.feld|(j|,2,k|)
p.feld|(1,j|,k|)=f.feld|(j|,1,k|)
p.feld|(2,j|,k|)=f.feld|(j|,0,k|)
NEXT j|
ENDIF
NEXT k|
ENDIF
@hochsetzen
@uebernehmen
RETURN
> PROCEDURE unten_rollen
IF l.b|<3 AND l.t|<3
d|=ABS(NOT BTST(b|,0))
FOR k|=0 TO 3
IF BTST(l|,k|)
p.feld|(0,SUCC(d|),k|)=f.feld|(0,d|,k|)
p.feld|(0,d|,k|)=f.feld|(1,d|,k|)
p.feld|(1,d|,k|)=f.feld|(1,SUCC(d|),k|)
p.feld|(1,SUCC(d|),k|)=f.feld|(0,SUCC(d|),k|)
ENDIF
NEXT k|
ELSE
FOR k|=0 TO 3
IF BTST(l|,k|)
FOR j|=0 TO 2
p.feld|(j|,0,k|)=f.feld|(2,j|,k|)
p.feld|(j|,1,k|)=f.feld|(1,j|,k|)
p.feld|(j|,2,k|)=f.feld|(0,j|,k|)
NEXT j|
ENDIF
NEXT k|
ENDIF
@hochsetzen
@uebernehmen
RETURN
> PROCEDURE rechts_rollen
IF l.l|<3 AND l.t|<3
k%=LEN(BIN$(l|))-2
IF k%<0
k%=0
ENDIF
FOR j|=0 TO 2
p.feld|(0,j|,SUCC(k%))=f.feld|(0,j|,k%)
p.feld|(0,j|,k%)=f.feld|(1,j|,k%)
p.feld|(1,j|,k%)=f.feld|(1,j|,SUCC(k%))
p.feld|(1,j|,SUCC(k%))=f.feld|(0,j|,SUCC(k%))
NEXT j|
ELSE
d|=ABS(NOT BTST(l|,0))
FOR j|=0 TO 2
FOR k|=0 TO 2
p.feld|(k|,j|,d|)=f.feld|(2,j|,k|+d|)
p.feld|(k|,j|,1+d|)=f.feld|(1,j|,k|+d|)
p.feld|(k|,j|,2+d|)=f.feld|(0,j|,k|+d|)
NEXT k|
NEXT j|
ENDIF
@hochsetzen
@uebernehmen
RETURN
> PROCEDURE links_rollen
IF l.l|<3 AND l.t|<3
k%=LEN(BIN$(l|))-2
IF k%<0
k%=0
ENDIF
FOR j|=0 TO 2
p.feld|(1,j|,k%)=f.feld|(0,j|,k%)
p.feld|(0,j|,k%)=f.feld|(0,j|,SUCC(k%))
p.feld|(0,j|,SUCC(k%))=f.feld|(1,j|,SUCC(k%))
p.feld|(1,j|,SUCC(k%))=f.feld|(1,j|,k%)
NEXT j|
ELSE
d|=ABS(NOT BTST(l|,0))
FOR j|=0 TO 2
FOR k|=0 TO 2
p.feld|(2,j|,k|+d|)=f.feld|(k|,j|,0+d|)
p.feld|(0,j|,k|+d|)=f.feld|(k|,j|,2+d|)
p.feld|(1,j|,k|+d|)=f.feld|(k|,j|,1+d|)
NEXT k|
NEXT j|
ENDIF
@hochsetzen
@uebernehmen
RETURN
> PROCEDURE uebernehmen
FOR i|=0 TO 2
FOR j|=0 TO 2
FOR k|=0 TO 3
IF p.feld|(i|,j|,k|)
IF feld|(ADD(i|,e1|),j|,k|)
belegt!=-1
ENDIF
ENDIF
NEXT k|
NEXT j|
NEXT i|
IF belegt!
PRINT CHR$(7)
ELSE
SWAP p.feld|(),f.feld|()
@fig_dim
ENDIF
ARRAYFILL p.feld|(),0
CLR belegt!
RETURN
> PROCEDURE fig_dim
CLR t|,b|,l|,l.t|,l.b|,l.l|
FOR i|=0 TO 2
FOR j|=0 TO 2
FOR k|=0 TO 3
IF f.feld|(i|,j|,k|)
l|=BSET(l|,k|)
b|=BSET(b|,j|)
t|=BSET(t|,i|)
ENDIF
NEXT k|
NEXT j|
NEXT i|
FOR i|=0 TO 3
IF BTST(t|,i|)
INC l.t|
ENDIF
IF BTST(b|,i|)
INC l.b|
ENDIF
IF BTST(l|,i|)
INC l.l|
ENDIF
NEXT i|
RETURN
> PROCEDURE hochsetzen
FOR i%=0 TO 1
CLR fin!
FOR j|=0 TO 2
FOR k|=0 TO 3
IF p.feld|(pos|,j|,k|)
fin!=TRUE
ENDIF
EXIT IF fin!
NEXT k|
NEXT j|
IF fin!=FALSE
BMOVE VARPTR(p.feld|(1,0,0)),VARPTR(p.feld|(0,0,0)),35
p.feld|(2,2,3)=0
ENDIF
EXIT IF fin!
NEXT i%
RETURN
> PROCEDURE setzen
LOCAL i|,j|,k|
REPEAT
IF e1|>0
@anzeige
ENDIF
FOR i|=0 TO PRED(l.t|)
FOR j|=0 TO 2
FOR k|=0 TO 3
IF f.feld|(i|,j|,k|)
IF feld|(SUCC(i|)+e1|,j|,k|)
ende!=-1
ENDIF
ENDIF
NEXT k|
EXIT IF ende!
NEXT j|
EXIT IF ende!
NEXT i|
INC e1|
UNTIL ende!
DEC e1|
CLR ende!
'
FOR i|=0 TO PRED(l.t|)
FOR j|=0 TO 2
FOR k|=0 TO 3
IF f.feld|(i|,j|,k|)
feld|(i|+e1|,j|,k|)=1
ENDIF
NEXT k|
NEXT j|
NEXT i|
@ebene_voll
@fuellen
FOR j|=0 TO 2
FOR k|=0 TO 1
IF feld|(1,j|,k|)
ultimo!=-1
ENDIF
IF feld|(0,j|,k|)
IF h_punkte%<punkte%
h_punkte%=punkte%
ENDIF
ende1!=-1
SOUND 1,15,12,4
WAVE 1,1,9,60000,30
SOUND 1,15,8,4
WAVE 1,1,9,60000,30
SOUND 1,15,3,4
WAVE 1,1,9,60000,40
WAVE 0,0
IF punkte%>pkt%(12)
best!=TRUE
@best_liste
ENDIF
@ende
ENDIF
NEXT k|
NEXT j|
RETURN
> PROCEDURE fuellen
LOCAL s1|
VOID XBIOS(5,L:screen%(0),L:screen%(1),-1)
BMOVE VARPTR(hoch|(0,0)),VARPTR(hoch1|(0,0)),12
FOR j|=0 TO 2
FOR k|=0 TO 3
CLR ende!
FOR i|=0 TO 9
IF feld|(i|,j|,k|)
hoch|(j|,k|)=i|
ende!=TRUE
ENDIF
EXIT IF ende!
NEXT i|
NEXT k|
NEXT j|
CLR ende!
DEFFILL 1,0
FOR i|=0 TO 9
FOR j|=0 TO 2
FOR k|=0 TO 3
IF hoch|(j|,k|)=i|
s1|=s|(hoch1|(j|,k|))
IF k|=0 OR j|=0
x&(0)=li|(i|)+s|(i|)*SUCC(k|)
y&(0)=ob|(i|)+s|(i|)*SUCC(j|)
x&(1)=li|(hoch1|(j|,k|))+s1|*SUCC(k|)
y&(1)=ob|(hoch1|(j|,k|))+s1|*SUCC(j|)
IF k|=0
x&(2)=x&(1)
y&(2)=ob|(hoch1|(j|,k|))+s1|*j|
x&(3)=x&(0)
y&(3)=ob|(i|)+s|(i|)*j|
POLYFILL 4,x&(),y&()
ENDIF
IF j|=0
x&(3)=li|(i|)+s|(i|)*k|
y&(3)=y&(0)
x&(2)=li|(hoch1|(j|,k|))+s1|*k|
y&(2)=y&(1)
POLYFILL 4,x&(),y&()
ENDIF
ENDIF
IF j|=2 OR k|=3
x&(0)=li|(hoch1|(j|,k|))+s1|*k|
y&(0)=ob|(hoch1|(j|,k|))+s1|*j|
x&(1)=li|(i|)+s|(i|)*k|
y&(1)=ob|(i|)+s|(i|)*j|
IF k|=3
x&(2)=x&(1)
y&(2)=ob|(i|)+s|(i|)*SUCC(j|)
x&(3)=x&(0)
y&(3)=ob|(hoch1|(j|,k|))+s1|*SUCC(j|)
POLYFILL 4,x&(),y&()
ENDIF
IF j|=2
x&(2)=li|(i|)+s|(i|)*SUCC(k|)
y&(2)=y&(1)
x&(3)=li|(hoch1|(j|,k|))+s1|*SUCC(k|)
y&(3)=y&(0)
POLYFILL 4,x&(),y&()
ENDIF
ENDIF
ENDIF
NEXT k|
NEXT j|
NEXT i|
i|=10
REPEAT
DEC i|
FOR j|=0 TO 2
FOR k|=0 TO 3
SELECT i|
CASE 0
DEFFILL 1,2,20
CASE 1
DEFFILL 1,2,19
CASE 2
DEFFILL 1,2,12
CASE 3
DEFFILL 1,2,11
CASE 4
DEFFILL 1,2,16
CASE 5
DEFFILL 1,2,4
CASE 6
DEFFILL 1,2,22
CASE 7
DEFFILL 1,2,3
CASE 8
DEFFILL 1,2,2
CASE 9
DEFFILL 1,3,3
ENDSELECT
IF hoch|(j|,k|)=i|
PBOX li|(i|)+s|(i|)*k|,ob|(i|)+s|(i|)*j|,li|(i|)+s|(i|)*SUCC(k|),ob|(i|)+s|(i|)*SUCC(j|)
ENDIF
IF feld|(i|,j|,k|)
PBOX 510+k|*10,21+i|*37+j|*10,510+SUCC(k|)*10,21+i|*37+SUCC(j|)*10
ENDIF
NEXT k|
NEXT j|
UNTIL i|=0
IF voll1!
WAVE 1,0
SOUND 1,15,20,5
WAVE 1,1,9,3000,3
WAVE 1,0
SOUND 1,15,16,5
WAVE 1,1,9,3000,3
WAVE 1,0
SOUND 1,15,8,3
WAVE 1,1,9,3000,3
WAVE 0,0
ENDIF
VSYNC
BMOVE screen%(0),screen%(1),32000
VOID XBIOS(5,L:screen%(1),L:screen%(1),-1)
RETURN
> PROCEDURE ende
IF ende1!
ALERT 2,"Wollen Sie 'SETZ AB' beenden,|oder wollen Sie es nocheinmal|versuchen ?",2,"Ende|Neustart",b.alert|
ELSE
ALERT 2,"Wollen Sie 'SETZ AB' beenden,|weiterspielen, oder wollen|Sie es nocheinmal versuchen ?",3,"Ende|Neustart|Weiter",b.alert|
ENDIF
IF b.alert|=1
VOID XBIOS(5,L:screen%(1),L:screen%(1),-1)
VOID GEMDOS(&H49,L:adresse%)
RESERVE FRE(0)+GEMDOS(&H48,L:-1)-17000
EDIT
ENDIF
IF b.alert|=2
@level
@hilfs_bs
CLR e|,e1|,punkte%,figur&,ultimo!,doppel!,ende!,best!,ende1!,zaehler|
ARRAYFILL feld|(),0
ARRAYFILL f.feld|(),0
ARRAYFILL hoch|(),10
FOR j|=0 TO 2
FOR k|=0 TO 3
feld|(10,j|,k|)=1
NEXT k|
NEXT j|
@bildaufbau
@zufall
ENDIF
IF b.alert|=3
zeit%=TIMER-t|*200
ENDIF
RETURN
> PROCEDURE ebene_voll
CLR voll1!
FOR i|=0 TO 9
voll!=TRUE
FOR j|=0 TO 2
FOR k|=0 TO 3
IF feld|(i|,j|,k|)=FALSE
CLR voll!
ENDIF
NEXT k|
NEXT j|
IF voll!
VOID XBIOS(5,L:screen%(0),L:screen%(1),-1)
l|=i|
REPEAT
DEC l|
FOR j|=0 TO 2
FOR k|=0 TO 3
feld|(SUCC(l|),j|,k|)=feld|(l|,j|,k|)
NEXT k|
NEXT j|
UNTIL l|=0
ARRAYFILL hoch|(),10
VSYNC
SPUT bild$
voll1!=-1
ENDIF
NEXT i|
RETURN
> PROCEDURE hilfs_bs
DEFFILL 1,2,5
PBOX 0,0,640,400
DEFFILL 1,0
PBOX 20,50,310,350
PBOX 350,50,620,350
DEFFILL 1,2,1
PBOX 70,100,220,250
ALINE 270,150,270,300,1,-1,0
ALINE 120,300,270,300,1,-1,0
ALINE 220,250,270,300,1,-1,0
ALINE 70,250,120,300,1,-1,0
ALINE 220,100,270,150,1,-1,0
DEFLINE 1,5,1,1
CIRCLE 145,175,30,200,3400
ELLIPSE 247,200,12,30,200,3400
ELLIPSE 170,277,30,12,1100,700
LINE 110,75,180,75
LINE 45,140,45,210
COLOR 1
ACHAR 49,143,55,2,0,0
ACHAR 50,27,167,2,0,0
ACHAR 51,142,167,2,0,0
ACHAR 52,245,192,2,0,0
ACHAR 53,167,269,2,0,0
DEFTEXT 1,1,,13
TEXT 410,70,"Tastaturbelegung !"
PRINT AT(49,6);"Aktion","Taste"
DEFTEXT 1,0,,6
TEXT 352,105,265,"(1) rechts schieben - Cursor rechts"
TEXT 352,118,265,"(1) links schieben - Cursor links "
TEXT 352,131,265,"(2) oben schieben - Cursor oben "
TEXT 352,144,265,"(2) unten schieben - Cursor unten "
TEXT 352,157,265,"(3) rechts drehen - ^Clr Home "
TEXT 352,170,265,"(3) links drehen - ^Insert "
TEXT 352,183,265,"(4) oben rollen - ^Cursor oben "
TEXT 352,196,265,"(4) unten rollen - ^Cursor unten "
TEXT 352,209,265,"(5) rechts rollen - ^Cursor rechts"
TEXT 352,222,265,"(5) links rollen - ^Cursor links "
TEXT 352,235,265," Figur setzen - Leertaste "
TEXT 355,273,265,"Diesen Bildschirm zeigen - Help "
TEXT 355,286,265,"Spiel abbrechen/beenden - Esc "
TEXT 355,299,265,"Besten - Liste - Tab "
DEFTEXT ,,,13
PRINT AT(46,21);">>> bitte eine Taste drücken <<<"
KEYGET dummy%
DEFLINE 1,1,0,0
RETURN
> PROCEDURE level
LOCAL a.level|
DEFMOUSE 0
BOUNDARY 0
FOR i|=1 TO 8
DEFFILL 1,2,i|
PBOX i|*20,i|*5,640-i|*20,400-i|*5
NEXT i|
DEFFILL 1,0
PBOX 180,55,460,345
DEFTEXT 1,1,,13
TEXT 190,75,"Level einstellen"
DEFTEXT 1,0,,6
TEXT 240,75,120,"(Zeit-Intervall)"
PRINT AT(25,7);"Nach jedem Zeit-Intervall fällt"
PRINT AT(25,8);"die Figur um 1 Ebene nach unten."
PRINT AT(25,18);"Punkteberechnung: Jede Figur"
PRINT AT(25,19);"wird mit Faktor multipliziert."
PRINT AT(25,21);">>> Weiter mit Eingabetaste <<<"
ATEXT 205,142,1,"Level 1 | 10 sec. Faktor 1"
ATEXT 205,160,1,"Level 2 | 7 sec. Faktor 2"
ATEXT 205,178,1,"Level 3 | 5 sec. Faktor 4"
ATEXT 205,196,1,"Level 4 | 4 sec. Faktor 6"
ATEXT 205,214,1,"Level 5 | 3 sec. Faktor 10"
ATEXT 205,232,1,"Level 6 | 2 sec. Faktor 18"
ATEXT 205,250,1,"Level 7 | 1 sec. Faktor 30"
FOR i|=0 TO 108 STEP 18
BOX 200,137+i|,340,153+i|
NEXT i|
level|=1
a.level|=1
GRAPHMODE 3
DEFFILL 1,1
PBOX 201,138,339,152
REPEAT
MOUSE x&,y&,k|
IF x&>200 AND x&<340 AND y&>136 AND y&<261 AND k|
level|=(y&-119)/18
PBOX 201,120+level|*18,339,134+level|*18
PBOX 201,120+a.level|*18,339,134+a.level|*18
a.level|=level|
PAUSE 10
ENDIF
UNTIL INKEY$=CHR$(13)
BOUNDARY 1
GRAPHMODE 1
DEFMOUSE STRING$(74,MKI$(0))
@levelconfig
RETURN
> PROCEDURE levelconfig
SELECT level|
CASE 1
faktor|=1
intervall|=10
CASE 2
faktor|=2
intervall|=7
CASE 3
faktor|=4
intervall|=5
CASE 4
faktor|=6
intervall|=4
CASE 5
faktor|=10
intervall|=3
CASE 6
faktor|=16
intervall|=2
CASE 7
faktor|=30
intervall|=1
ENDSELECT
RETURN
> PROCEDURE titelbild
DEFFILL 1,1
PBOX 0,0,640,400
VOID XBIOS(5,L:screen%(0),L:screen%(1),-1)
CLS
DEFFILL 1,2,19
PBOX 0,0,640,270
BOUNDARY 0
DEFFILL 1,0
PBOX 20,20,576,260
GRAPHMODE 3
DEFFILL 1,1
PRBOX 20,20,120,260
PRBOX 40,40,120,130
PRBOX 20,150,100,240
PBOX 130,60,200,220
PBOX 148,76,200,133
PBOX 148,147,200,204
PBOX 205,90,265,190
PBOX 205,102,229,190
PBOX 241,102,265,190
PBOX 270,111,308,120
PBOX 270,160,308,168
GRAPHMODE 1
LINE 308,111,270,160
LINE 270,168,308,120
FILL 287,140
DEFFILL 1,0
PBOX 110,120,120,129
PBOX 20,151,30,160
BOX 313,111,389,168
DRAW 314,130 TO 389,130 TO 576,99
DRAW 314,149 TO 389,149 TO 576,179
DRAW 333,167 TO 333,111 TO 240,19
LINE 352,167,352,19
LINE 371,111,464,19
LINE 371,128,391,128
ALINE 128,19,313,111,1,-1,0
ALINE 389,111,576,19,1,-1,0
ALINE 389,168,576,260,1,-1,0
ALINE 313,168,111,260,1,-1,0
DEFFILL 1,2,16
BOUNDARY 1
PBOX 355,109,374,169
BOUNDARY 0
PBOX 373,110,391,127
DRAW 129,19 TO 576,19 TO 576,260
DRAW 181,46 TO 520,46 TO 520,233
DRAW 221,66 TO 480,66 TO 480,212
DRAW 251,81 TO 452,81 TO 452,198
DRAW 271,89 TO 432,89 TO 432,190
DRAW 284,97 TO 418,97 TO 418,183
DRAW 296,102 TO 408,102 TO 408,176
DRAW 300,105 TO 401,105 TO 401,173
DRAW 303,107 TO 396,107 TO 396,170
DRAW 311,109 TO 392,109 TO 392,169
DEFLINE 1,3
DRAW 135,258 TO 307,178 TO 346,258
LINE 220,218,327,218
DRAW 427,196 TO 400,183 TO 385,178 TO 360,178 TO 360,258 TO 500,258
DRAW 380,218 TO 457,218 TO 477,221 TO 507,239
CIRCLE 420,206,12,2700,900
CIRCLE 497,246,12,2700,900
FOR i|=1 TO 7
DEFFILL 1,2,i|
PBOX 0,263+i|*17,640,263+SUCC(i|)*17
NEXT i|
BOUNDARY 1
PRINT AT(23,28);" Weiter mit Eingabetaste ";
DEFTEXT ,,900,13
TEXT 638,260," von Werner Lang - Stuttgart "
TEXT 622,260," Version 1,0 "
BMOVE screen%(0),screen%(1),32000
VOID XBIOS(5,L:screen%(1),L:screen%(1),-1)
REPEAT
UNTIL INKEY$=CHR$(13)
DEFTEXT ,,0
DEFLINE 1,1
CLS
RETURN
> PROCEDURE best_liste
CLS
BOUNDARY 0
FOR i|=1 TO 8
DEFFILL 1,2,i|
PBOX i|*20,i|*5,640-i|*20,400-i|*5
NEXT i|
DEFFILL 1,0
PBOX 180,50,460,350
DEFTEXT 1,9
BOUNDARY 1
TEXT 260,70,"Besten - Liste"
DEFTEXT ,0
PRINT AT(34,6);"Name","Punkte"
CLR k|
FOR i|=1 TO 12
PRINT AT(25,7+i|);USING "##",i|;
IF punkte%>pkt%(i|) AND k|=0 AND best!
PRINT ". _________________ ___ ___"
PRINT AT(50,i|+7);USING "###_ ###",punkte%
INSERT nam$(i|)=""
INSERT pkt%(i|)=punkte%
k|=i|
ELSE
IF pkt%(i|)>0
PRINT AT(29,i|+7);nam$(i|)
PRINT AT(50,i|+7);USING "###_ ###",pkt%(i|)
ELSE
PRINT ". _________________ ___ ___"
ENDIF
ENDIF
NEXT i|
IF k|
LOCATE 29,k|+7
FORM INPUT 17,nam$(k|)
@speichern
ENDIF
PRINT AT(26,21);">>> Weiter mit Eingabetaste <<<"
REPEAT
UNTIL INKEY$=CHR$(13)
RETURN
> PROCEDURE speichern
a$=SPACE$(17)
b$=SPACE$(7)
OPEN "R",#1,"punkte.dat"
FIELD #1,17 AS a$,6 AS b$
FOR i|=1 TO 12
LSET a$=nam$(i|)
LSET b$=STR$(pkt%(i|))
PUT #1,i|
NEXT i|
CLOSE #1
RETURN
> PROCEDURE laden
IF EXIST("punkte.dat")
OPEN "R",#1,"punkte.dat"
FIELD #1,17 AS a$,6 AS b$
FOR i|=1 TO 12
GET #1,i|
nam$(i|)=a$
pkt%(i|)=VAL(b$)
NEXT i|
CLOSE #1
ENDIF
RETURN